import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken } from '@/utils/auth'
import router from '@/router'

// 创建 axios 实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 5000
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    if (store.getters.token) {
      const token = getToken()

      // 优先使用 Authorization 头（带Bearer前缀）
      config.headers['Authorization'] = `Bearer ${token}`

      // 同时设置 token 头（备用）
      config.headers['token'] = token
    }
    return config
  },
  error => {
    console.log(error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    const res = response.data
    console.log('res', res)

    // 判断自定义状态码
    if (res.code && res.code !== 200) {
      Message({
        message: res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })

      if ([50008, 50012, 50014].includes(res.code)) {
        MessageBox.confirm(
          '登录状态已过期，请重新登录',
          '确认登出',
          {
            confirmButtonText: '重新登录',
            cancelButtonText: '取消',
            type: 'warning'
          }
        ).then(() => {
          store.dispatch('user/resetToken').then(() => {
            location.reload()
          })
        })
      }

      return Promise.reject(new Error(res.message || 'Error'))
    } else {
      return res
    }
  },
  error => {
    console.log('err' + error)

    // 处理HTTP状态码错误
    if (error.response) {
      const { status, data } = error.response

      // 处理401未授权错误（token过期）
      if (status === 401) {
        // 默认提示信息
        let userMessage = '您的登录状态已失效，请重新登录以继续使用系统功能'
        let title = '登录状态提醒'
        let confirmText = '重新登录'
        let cancelText = '取消'

        // 从后端获取具体错误信息
        if (data && typeof data === 'string') {
          try {
            const errorData = JSON.parse(data)
            const serverMsg = errorData.msg || ''

            // 根据后端返回的信息定制前端提示
            if (serverMsg.includes('token不存在')) {
              userMessage = '检测到您尚未登录，请先登录系统'
              title = '未登录提醒'
              confirmText = '立即登录'
            } else if (serverMsg.includes('过期')) {
              userMessage = '为了您的账户安全，登录会话已自动过期，请重新登录'
              title = '安全提醒'
              confirmText = '安全登录'
            } else if (serverMsg.includes('无效')) {
              userMessage = '登录凭证无效，这可能是因为您在其他设备登录或会话异常'
              title = '登录异常'
              confirmText = '重新验证'
            } else {
              userMessage = serverMsg || userMessage
            }
          } catch (e) {
            // 如果不是JSON格式，使用原始信息
            userMessage = data || userMessage
          }
        }

        MessageBox.confirm(
          userMessage,
          title,
          {
            confirmButtonText: confirmText,
            cancelButtonText: cancelText,
            type: 'warning',
            // 可以添加更多自定义选项
            customClass: 'token-expire-dialog',
            closeOnClickModal: false,  // 不允许点击遮罩关闭
            closeOnPressEscape: false  // 不允许ESC键关闭
          }
        ).then(() => {
          performLogout()
        }).catch(() => {
          performLogout()
        })
      }
      // 处理其他HTTP错误
      else {
        const errorMessage = data?.message || error.message || '请求失败'
        Message({
          message: errorMessage,
          type: 'error',
          duration: 5 * 1000
        })
      }
    } else {
      // 网络错误或其他错误
      Message({
        message: error.message || '网络错误',
        type: 'error',
        duration: 5 * 1000
      })
    }

    return Promise.reject(error)
  }
)

/**
 * 执行登出操作
 */
function performLogout() {
  // 清除本地存储
  localStorage.removeItem('token')
  localStorage.removeItem('userInfo')
  localStorage.removeItem('userRole')
  sessionStorage.clear()

  // 重置store状态
  store.dispatch('user/resetToken')

  // 跳转到登录页
  router.push('/login')

  // 显示成功消息
  Message({
    message: '已退出登录',
    type: 'success',
    duration: 3000
  })
}

export default service
